#!/usr/bin/env bun

// 首先加载配置和环境变量
import './config.js';

import { Command } from 'commander';
import { McpServer } from './servers/mcp-server.js';
import { configureLogger, logger } from './utils/logger.js';

/**
 * 解析命令行参数
 */
function parseArgs() {
  const program = new Command();

  program
    .name('test-case-writer')
    .version('2.0.0')
    .description('Test Case Writer MCP Service')
    .addHelpText(
      'after',
      `
示例：
  # 启动stdio MCP服务（Claude Desktop）
  $ bun src/index.ts
  
  # 启动stdio MCP服务并启用stderr调试输出
  $ bun src/index.ts --debug-stderr
  
  # 启动streamable HTTP MCP服务
  $ bun src/index.ts --streamable-http --port=3001
  
  # 使用自定义工具目录
  $ bun src/index.ts --tools-dir custom-tools`
    );

  // 传输模式选项
  program
    .option('--stdio', '使用stdio传输（默认，适用于Claude Desktop）')
    .option('--streamable-http', '使用streamable HTTP传输（适用于n8n集成）')
    .option('--mcp-http', '同--streamable-http');

  // 其他配置选项
  program
    .option('--port <number>', '指定端口号', parseFloat)
    .option('--cors', '启用CORS（仅HTTP传输）')
    .option('--debug-stderr', 'stdio模式下将console输出重定向到stderr而不是禁用（用于调试）');

  program.parse();
  const options = program.opts();

  // 确定传输模式
  let transport: 'stdio' | 'streamable-http' = 'stdio';
  if (options.streamableHttp || options.mcpHttp) {
    transport = 'streamable-http';
  }

  return {
    transport,
    port: options.port,
    cors: options.cors,
    debugStderr: options.debugStderr,
    help: program.args.includes('--help') || program.args.includes('-h'),
  };
}

/**
 * 启动MCP服务
 */
async function startMCPService(args: ReturnType<typeof parseArgs>): Promise<void> {
  try {
    // 配置日志系统
    configureLogger(args.transport, { 
      redirectToStderr: args.debugStderr 
    });

    const server = new McpServer();

    // 确定端口号
    const defaultPort = args.transport === 'streamable-http' ? 3001 : 0; // stdio不需要端口
    const port = args.port || defaultPort;

    // 根据传输类型启动服务
    switch (args.transport) {
      case 'streamable-http':
        logger.info('Starting MCP service in Streamable HTTP mode...');
        await server.startStreamableHttp(port, args.cors);
        logger.info(`✅ Streamable HTTP service started on port ${port}`);
        break;
      case 'stdio':
      default:
        logger.info('Starting MCP service in stdio mode...');
        // 注意：stdio模式会阻塞在这里，持续监听输入
        await server.startStdio();
        // 这行代码永远不会执行，因为stdio模式需要持续运行
        break;
    }

    // 优雅关闭
    process.on('SIGINT', async () => {
      logger.info('🛑 Shutting down service...');
      process.exit(0);
    });
  } catch (error) {
    logger.error('❌ Failed to start MCP service:', error);
    process.exit(1);
  }
}

/**
 * 主函数
 */
async function main() {
  const args = parseArgs();
  await startMCPService(args);
}

if (import.meta.main) {
  main();
}

export { McpServer };
